Linux は HDD の基本領域にも論理領域にもインストールが可能であり、該当パーティションのアクティブ フラグがアクティブである必要もない。こうした機能は Linux のローダである grub や LILO によって実現されています。
grub はファイル サイズが大きく MBR のサイズ (1 セクタ) におさまらないため、"プライマリ" と "セカンダリ" の 2つのファイルに分割され、それぞれを stage1, stage2 と呼んでいます。
またはGRUB Legacyの場合は、三段階(stage1 + stage1.5 + stage2)の場合もあります。
stage1 を MBR、stage2 を Linux のパーティション内に配置し、stage1 が stage2 をロード、stage2 が Linux をロードして行きます。
stage1 は特定のファイルシステムに依存せず、直接アドレスを指定 (LBA を用いてハードディスクのセクタを直接指定) することでディスクアクセスを行います。
stage1.5 は/bootパーティションがハードディスクの1024シリンダ以降にある場合や、LBAモードが使用されている場合に必要となります。
ハードディスクのアクセスやファイル管理は、記録単位のセクタを特定 (位置指定) することで行います。 セクタの位置に関する情報をアドレスと呼び、その指定方法は次の2つの方式があります。
GRUB は、二段階(stage1 + stage2)、または三段階(stage1 + stage1.5 + stage2)の手順を経て起動します。
stage1 はMBRにあるIPLです。
stage1.5 は、MBRの次のセクタから連続した数セクタに入っています。
stage2 は、ファイルシステム(ext2(Linux), ffs(FreeBSD等), minix, FAT(MS-DOS, Win95/98等))上にあるファイルになっています。
a. stage1 + stage2 の場合
stage1 は、stage2 の実体が格納されているディスク上のアドレスを記憶しており、そのアドレスから連続した領域をメモリに読み込み、 それに処理を移します。
b. stage1 + stage1.5 + stage2 の場合
stage1 は、C/H/S=0/0/1 に格納されている stage1.5 をメモリに読み込み、それに処理を移します。
stage1.5 は、stage2 のあるファイルシステムを読めるので、stage2のあるパスを探して、ディスク上にどのような形で格納されているのかを確認し(FATならFAT chain をたどる)、メモリに読み込み、それに処理を移します。
stage2 が読まれるとstage2 は、メニューやコマンドプロンンプトを表示して、ユーザの指示に合ったカーネルをロードして起動します。
MBR の stage1 がロードする stage2 の先頭セクタ、および stage2 の先頭セクタがロードする後続のセクタは、ファイルシステム (ext2/ext3) に頼らずセクタ位置を直接指定してロードします。
これは stage2 のファイル名を変更してもディスク上の位置 (セクタ) に変更がなければ grub は正常に起動できるが、見た目は同一ディレクトリ上に stage2 があっても、セクタ位置が変更されていると grub が正常に起動できないことを意味します。
stage2はファイルシステム上のファイルになっているので、容易に移動やコピー、削除ができてしまいます。 したがって、前者の構成ですと
# mv stage2 stage2_orig # cp stage2_orig stage2 # rm stage2_orig # dd if=/dev/zero of=fill_stage2_orig_space_with_zero |
等のようなことをすると、stage2 という名前のファイルは最初と同様なものが存在しますが、元々あったstage2 のディスク上のアドレスにはゴミが入っているので、GRUBが起動しなくなります。
また、GRUB version 0.5.93.1 の段階では、stage1 からは 8GB(1024シリンダ) の範囲までしかディスクを読むことができないので、stage2 がこの領域よりも外側にあった場合はやはり起動しません。 この場合は、stage1_lba を使えばいいのですが、stage1_lba はLBAによるアクセスしか行なわないため、フロッピーにインストールしてそのフロッピーから起動する、ということができないという問題があります。
よって、stage1.5を使用する起動方法の方が安全です。
(1)カーネルの読み込み
Linuxを起動するためにカーネル・イメージをメモリー上に読み込む。カーネル・イメージはbzip2やgzipで圧縮されたファイルです。
(2)initrdを読み込み
カーネル・イメージを読み込んだら、次に initrd ファイルを読み込む。initrd ファイルは、Linuxが起動するときに必要なモジュール(ドライバ)や起動スクリプトを含んだファイルです。通常gzipで圧縮されており、カーネル・イメージをメモリー上に読み込んだ後、カーネル起動時にメモリー上にファイル・システムとして展開されます。
(3)カーネルの起動
読み込みが完了したら、GRUBによってカーネルが起動されます。カーネルは自分自身と initrd ファイルを展開して、初期化処理を実施します。その際、展開された initrd ファイルを、起動時に用いるルート・ファイル・システムとしてマウントします。
(4)linuxrcスクリプトの実行
initrd ファイルには「linuxrc」というスクリプトが含まれています。この linuxrc スクリプトにはルート・ファイル・システムをマウントする際に必要なドライバをカーネルに読み込んでから、実際のルート・ファイル・システムをマウントするための処理が記述されています。
必要なドライバを読み込んでから実際のルート・ファイル・システムをマウントするという処理になるため、PC内のいかなるデバイスにルート・ファイル・システムを保存している場合にも確実にマウントできます。
(5)初期化プロセスの実行
実際のルート・ファイル・システムをマウントしたら、今度はルート・ファイル・システム内にあるファイルを用いて初期化プロセスが実行されます。この初期化プロセスが完了すれば、Linuxが使えるようになります。
Red Hat Linux 7.2では、ブート時に /etc/rc.d/rc.sysinit というスクリプトを実行するようになっています。/etc/inittab の、
# vi /etc/inittab |
# System initialization. si::sysinit:/etc/rc.d/rc.sysinit |
という行で定義されています。ざっとその内容を見ると、
rcスクリプトは、Windowsのautoexec.batのようなものです。もちろん、rcスクリプトとautoexec.batでは異なる点があります。rcスクリプトは、対応する作業ごとに1つずつ、複数のファイルで構成されています。また、ランレベルごとに実行するrcスクリプトを変えることができます。
rcスクリプトの実体は、/etc/init.d に収められている単なるシェルスクリプトです。そして、/etc ディレクトリには各ランレベルに対応したディレクトリ /etc/rc0.d?/etc/rc6.d が用意されています。これらのディレクトリに、/etc/init.d 内のrcスクリプトへのシンボリックリンクを作って利用します。例えば、Apacheを起動する「httpd」というスクリプトが /etc/init.d にあり、ランレベル3でApacheを利用する場合は /etc/rc3.dに/etc/init.d/httpd のシンボリックリンクを作るというわけです。
各ディレクトリに作成するシンボリックリンクのファイル名は、原則として「S」+「2けたの数値」(※注1)で始め、その後に実体のファイル名を続けることになっています。例えば、「S85httpd」という具合です。2けたの数字は実行順の制御に使われ、数字が小さいスクリプト→大きいスクリプトの順番で実行されます。
※注1:数値はディストリビューションなどによって異なる場合がある。また、数値を変更することも可能だが、サービスによっては起動順に気をつける必要がある。
ランレベルごとのディレクトリを見ると、ファイル名が「K」で始まるファイルがあります。これは、サービスなどを停止するスクリプトです。
Kで始まるスクリプトが必要になる典型例が、ランレベル1、すなわちシングルユーザーモードに移行する場合です。シングルユーザーモードでは必要最小限のサービスだけにする必要があるので、マルチユーザーモードで動いているサービスを明示的に止めなければなりません。
各ランレベルのディレクトリにあるのはシンボリックリンクです。これによって1つのrcスクリプトを複数のランレベルで共有できます。/etc/rc[0-6].d以下にそれぞれファイルの実体を配置した場合、あるファイルを修正するとそのファイルを必要とする各ディレクトリにコピーしなければなりません。実際にはシンボリックリンクなので、シンボリックリンク元のファイルを変更するだけで/etc/rc[0-6].d以下にも修正が自動的に反映されます。
不要なサービスを停止する場合は、Red Hat Linux 7.2の /etc/rc3.d ディレクトリ(ランレベル3用)には、標準で S09isdn や S90FreeWnn といったシンボリックリンク(※注2)があります。
※注2:S09isdnは/etc/init.d/isdn、S90FreeWnnは/etc/init.d/FreeWnnが実体のスクリプト。
これらによって起動されたサービスを止めるには、root権限でstopを引数にして該当スクリプトを実行します。例えば、FreeWnnを止めるなら、
# /etc/rc3.d/S90FreeWnn stop |
また、起動時から不要なサービスであれば、/etc/rc[0-6].dにあるシンボリックリンクを削除します。元のファイルは /etc/init.d に残っているので、必要になった時点でもう一度シンボリックリンクを作成します。GUIベースでこれを行ってくれるツールもありますが、要はシンボリックリンクを作ったり削除したりするだけです。原理が分かっていれば、sshでログインしてコマンドラインで簡単に変更できます。
● System VとBSD
これまでに説明してきた仕組みは、System Vのやりかたです。
rcスクリプトにはもう1つ、BSD風もあり、こちらは/etc/に直接rcスクリプトを配置します。この場合は、まずシングルユーザーモードで起動し、マルチユーザーモードに移行する時点で一般的なrcや各ホスト固有の設定を行うrc.localなどを実行します。
最近主流のRed Hat系のディストリビューションやDebian GNU/LinuxではSystem V方式を取っていますが、Red Hatの前に主流だったSlackwareではBSD風のrcスクリプトが使われています。
chkconfig コマンドは、Linuxのシステム起動時に、サービスの自動起動を設定するためのものです。
サービス起動の一覧やランレベルごとのサービス起動の登録、変更、削除の設定が行えます。
chkconfig [オプション] [サービス名] |
|
--add サービス名 | 指定したサービスを一覧に追加する。 |
--del サービス名 | 指定したサービスを一覧から削除します。 |
--list | サービスの一覧を表示します。 |
[--level [ランレベル]] サービス名 on | ランレベルを指定してサービス起動設定を行う。 [--level ランレベル]を省略した場合は、ランレベル2~5に設定する。 |
[--level [ランレベル]] サービス名 off | ランレベルを指定してサービス起動設定を取り消す。 [--level ランレベル]を省略した場合は、ランレベル2~5を取り消す。 |
-h | ヘルプを表示する。 |
-v | バージョンを表示する。 |
● systemd系の起動プロセス
レスキューモード
レスキューモードはシングルユーザーモードと同等であり、rootパスワードが必要です。 レスキューモードを使用すると、通常の起動プロセスを完了できない状況でシステムを修復できます。 レスキューモードは、すべてのローカルファイルシステムをマウントし、いくつかの重要なシステムサービスを開始しようとしますが、ネットワークインターフェイスをアクティブ化せず、複数のユーザーがログインすることもできません。
緊急モード
緊急モードは、可能な限り最小限の環境を提供し、システムがレスキューモードに入ることができない状況でもシステムを修復できるようにします。 緊急モードでは、システムはルートファイルシステムを読み取り専用としてマウントし、他のローカルファイルシステムをマウントしようとせず、ネットワークインターフェイスをアクティブにしません。
# systemctl emergency |
# systemctl rescue |
www.it-shikaku.jp